package com.chen.util;

public class StringUtils {
    private StringUtils() {
    }

    // 使用递归
    public static boolean isRecycleStringByRecursion(String str) {
        String target = str.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
        if (target.length() <= 1) return true;
        if (target.charAt(0) == target.charAt(target.length() - 1)) {
            return isRecycleStringByRecursion(target.substring(1, target.length() - 1));
        } else {
            return false;
        }

    }

    // 使用字符串反转，如何与原字符串比较，一样就是回文
    public static boolean isRecycleStringByReverse(String str) {
        String target = str.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
        char[] chars = target.toCharArray();
        int right = chars.length - 1;
        int left = 0;
        while (left < right) {
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
        return new String(chars).equals(target);
    }

    //检查一个字符串是否从前往后读和从后往前读是一样的（忽略空格、标点符号和大小写）
    //输入 `"A man a plan a canal Panama"`，输出 `true`。
    public static boolean isRecycleString(String str) {
        // 忽略忽略空格、标点符号和大小写
        // 首先要把空格、标点符号弃掉
        String target = str.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
        // 只要判断前后相同位置有不一样的，就能判断这不是回文
        int right = target.length() - 1;
        int left = 0;
        while (left < right) {
            if (target.charAt(left) != target.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }


    //将给定的字符串顺序颠倒
    // 输入 `"hello"`，输出 `"olleh"`
    // 实现字符串反转的做法

    // 4，使用StringBuilder或者StringBuffer的reverse()
    public static String reverseStringByStringBuilder(String str) {
        if (str == null || str.length() <= 1) {
            return str;
        }
        return new StringBuilder(str).reverse().toString();
    }

    // 3.使用使用流
    public static String reverseStringByStream(String str) {
        if (str == null || str.length() <= 1) {
            return str;
        }
        return str.chars().mapToObj(s -> String.valueOf((char) s))
                .reduce("", (s1, s2) -> s2 + s1);
    }

    // 2.使用递归实现
    // 性能不好，但是可以理解递归
    public static String reverseStringByRecursion(String str) {
        if (str == null || str.length() <= 1) {
            return str;
        }
        return str.charAt(str.length() - 1) + reverseStringByRecursion(str.substring(0, str.length() - 1));
    }

    // 1.双指针法
    public static String reverseStringByDoublePoint(String str) {
        if (str == null || str.length() <= 1) {
            return str;
        }
        // 1.使用双指针
        char[] chars = str.toCharArray();
        int right = str.length() - 1;
        int left = 0;
        while (right >= left) {
            char temp = chars[right];
            chars[right--] = chars[left];
            chars[left++] = temp;
        }
        return new String(chars);
    }
}
